package com.clf.data.redis.core.json.ops;

import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.RedisOperations;

import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;


/**
 * ops覆盖接口，用于动态代理
 * 
 * @author <a href="mailto:zhudelie@zuozh.com">zhudelie</a>
 * @version
 * @since JDK 1.6 create on 2017年3月31日 Copyright 2017 ZZJR All Rights Reserved.
 *
 */
public interface FastJsonBoundValueOperations<K, V> extends BoundValueOperations<K, V> {
	
	//@Deprecated
	//void set(V value, DBExecutor<Object> db);

	//@Deprecated
	//void set(V value, DBExecutor<Object> db, Long timeout, TimeUnit unit);

	//@Deprecated
	//V get(DBExecutor<V> db);

	//@Deprecated
	//V get(DBExecutor<V> db, Long timeout, TimeUnit unit);
	/**
	 * 获得指定类型的值
	 * @param type
	 * @return
	 */
	<T> T get(Class<T> type);

	//@Deprecated
	//<T> T get(Class<T> type, DBExecutor<T> db);

	//@Deprecated
	//<T> T get(Class<T> type, DBExecutor<T> db, Long timeout, TimeUnit unit);
	/**
	 *  得到一个list类型的值
	 * @return
	 */
	List<V> getList();

	//@Deprecated
	//List<V> getList(DBExecutor<List<V>> db);

	//@Deprecated
	//List<V> getList(DBExecutor<List<V>> db, Long timeout, TimeUnit unit);
	/**
	 * 得到一个list类型的值，list里面的元素类型为指定类型
	 * @param type
	 * @return
	 */
	<T> List<T> getList(Class<T> type);

	//@Deprecated
	//<T> List<T> getList(Class<T> type, DBExecutor<List<T>> db);

	//@Deprecated
	//<T> List<T> getList(Class<T> type, DBExecutor<List<T>> db, Long timeout, TimeUnit unit);
	/**
	 * 获得key
	 */
	@Override
	K getKey();
	/**
	 * 获得类型
	 */
	@Override
	DataType getType();
	/**
	 * 获得过期时间
	 */
	@Override
	Long getExpire();
	/**
	 * 设置过期时间
	 */
	@Override
	Boolean expire(long timeout, TimeUnit unit);
	/**
	 * 设置过期时间
	 */
	@Override
	Boolean expireAt(Date date);
	/**
	 *  取消过期时间
	 */
	@Override
	Boolean persist();
	/**
	 * 重命名key
	 */
	@Override
	void rename(K newKey);
	/**
	 * 设置值
	 */
	@Override
	void set(V value);
	/**
	 * 设置值，并设置过期时间
	 */
	@Override
	void set(V value, long timeout, TimeUnit unit);
	/**
	 * 设置值，如果当前值为空的话
	 */
	@Override
	Boolean setIfAbsent(V value);
	/**
	 * 获取值
	 */
	@Override
	V get();
	/**
	 * 获取值,同时设置一个新值
	 */
	@Override
	V getAndSet(V value);
	/**
	 * 自增
	 */
	@Override
	Long increment(long delta);
	/**
	 * 自增
	 */
	@Override
	Double increment(double delta);
	/**
	 * 追加字符串
	 */
	@Override
	Integer append(String value);
	/**
	 * 获得字符串中的一部分
	 */
	@Override
	String get(long start, long end);
	/**
	 * 指定的字符串覆盖给定 key 所储存的字符串值，覆盖的位置从偏移量 offset 开始。
	 */
	@Override
	void set(V value, long offset);
	/**
	 *获得字符串长度
	 */
	@Override
	Long size();

	@Override
	RedisOperations<K, V> getOperations();

}
